/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fornecedor;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Tulio José
 * @author Alberto Medeiros
 */
public class RepositorioFornecedor implements IRepositorioFornecedor {

    private static final String MSG_ERRO_ACESSO__BD = "Erro de acesso ao banco de dados";
    
    /**
     * 
     * @throws ErroAcessoRepositorioException 
     */
    public RepositorioFornecedor() throws ErroAcessoRepositorioException {}

    /**
     * Método que ira cadastrar / atualizar os Fornecedores na base
     * 
     * @param objFornecedor
     * @throws ErroAcessoRepositorioException 
     */
    public void cadastrarAtualizar(Fornecedor objFornecedor) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;

        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            s.saveOrUpdate(objFornecedor);
            
            t.commit();
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }

    /**
     * Método que irá procurar um determinado objeto na base
     * 
     * @param idFornecedor
     * @throws FornecedorNaoCadastradoException
     * @throws ErroAcessoRepositorioException 
     * @return Fornecedor
     */
    public Fornecedor procurar(int idFornecedor) throws FornecedorNaoCadastradoException, ErroAcessoRepositorioException {
        Fornecedor objFornecedor = null;
        if (this.existe(idFornecedor)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                
                // Procurando o objeto na base
                objFornecedor = (Fornecedor) s.get(Fornecedor.class, idFornecedor);
                t.commit();
            } catch (Exception e) {
                
                t.rollback();
                throw new FornecedorNaoCadastradoException();
            }
        } else {
            throw new FornecedorNaoCadastradoException("Fornecedor Não Encontrado");
        }
        return objFornecedor;
    }
    
    /**
     * Método que ira verificar a existência de um objeto na base
     * 
     * @param idFornecedor
     * @throws ErroAcessoRepositorioException 
     * @return boolean
     */
    public boolean existe(int idFornecedor) throws ErroAcessoRepositorioException {
        Fornecedor objFornecedor = null;
        Session s = null;
        Transaction t = null;
        
        try {
            // Recuperando a seção atual
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            // Procurando o objeto na base
            objFornecedor = (Fornecedor) s.get(Fornecedor.class, idFornecedor);
            
            // Comintando 
            t.commit();
        } catch (Exception e) {
            t.rollback();
        }
        return (objFornecedor != null);
    }
    
    /**
     * Método que ira listar os objetos Fornacedores na base
     * 
     * @throws Exception
     * @throws ErroAcessoRepositorioException
     * @return List<Fornecedor>
     */
    public List<Fornecedor> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<Fornecedor> listFornecedor = null;
        Session s = null;
        Transaction t = null;

        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            Query q = s.createQuery("from Fornecedor  WHERE id_fornecedor IS NOT NULL " + strComplemento + " ORDER BY id_fornecedor");
            
            listFornecedor = q.list();
            
            t.commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO__BD, null, 1);
        }
        return listFornecedor;
    }
    
    /**
     * Método que ira listar os objetos Fornacedores na base pela descrição
     * 
     * @throws Exception
     * @throws ErroAcessoRepositorioException
     * @return List<Fornecedor>
     */
    public List<Fornecedor> listarPorDescricao(String strDescricao) throws Exception, ErroAcessoRepositorioException {
        List<Fornecedor> listFornecedor = null;
        Session s = null;
        Transaction t = null;

        try {
            if(strDescricao.trim().length() ==0)
                return this.listar(" AND status_fornecedor  = true ");
            
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando a query
            Query q = s.createQuery("from Fornecedor  WHERE id_fornecedor IS NOT NULL AND descricao_fornecedor LIKE :descricao_fornecedor ORDER BY id_fornecedor");
            // Setando o parametro 
            q.setParameter("descricao_fornecedor", "%" + strDescricao + "%");
            
            listFornecedor = q.list();
            
            t.commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO__BD, null, 1);
        }
        return listFornecedor;
    }

    /**
     * Método que ira remover um objeto na base
     * 
     * @param idFornecedor
     * @throws FornecedorNaoCadastradoException
     * @throws ErroAcessoRepositorioException 
     */
    public void remover(int idFornecedor) throws FornecedorNaoCadastradoException, ErroAcessoRepositorioException {
        Fornecedor objFornecedor = null;
        if (this.existe(idFornecedor)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                //recuperando a nivel do produto
                objFornecedor = (Fornecedor) s.get(Fornecedor.class, idFornecedor);
                //setar IdFornecedor como escluido
                objFornecedor.setStatusFornecedor(false);
                
                // Comitando as transacoes
                t.commit();
                
                //atualizar para excluido
                this.cadastrarAtualizar(objFornecedor);
            } catch (Exception e) {
                throw new FornecedorNaoCadastradoException();
            }
        }


    }
}